import logging
from typing import Dict, List
from configparser import ConfigParser

from chat import call_llm_api, init_models

logger = logging.getLogger(__name__)


async def generate_description(instruction: str) -> Dict[str, str]:
    """
    输入示例：
        "海工钢-生产工艺-热处理；海工钢-性能-抗腐蚀性；海洋平台"
    输出示例：
        {
            "海工钢-生产工艺-热处理": "热处理是提升海工钢性能的重要工艺步骤……",
            "海工钢-性能-抗腐蚀性": "抗腐蚀性是海工钢在海洋环境中的关键性能……",
            "海洋平台": "海洋平台是用于海上资源开采和作业的基础结构……"
        }
    """

    triplets = [seg.strip() for seg in instruction.split("；") if seg.strip()]
    if not triplets:
        raise ValueError("输入 instruction 为空或格式错误")

    result_dict: Dict[str, str] = {}

    for t in triplets:
        try:
            parts = [p.strip() for p in t.split("-") if p.strip()]
            if not parts:
                logger.warning(f"跳过空输入: {t}")
                continue

            # 最后一个是目标词，其余作为背景
            if len(parts) == 1:
                context = ""
                target = parts[0]
            else:
                context = "-".join(parts[:-1])
                target = parts[-1]

            # 构建 prompt
            if context:
                prompt = f"""
你是一名专业的技术分析助手。请根据以下背景内容，为最后一个术语生成简洁、专业的解释。

背景内容：
{context}

需要解释的术语：
{target}

要求：
- 解释应体现该术语在背景中的作用、特点或关键过程。
- 不要生成标题、前缀或无关说明。
直接输出解释文本。
"""
            else:
                prompt = f"""
你是一名专业的技术分析助手。请对以下术语生成简洁、准确的定义或解释。

术语：
{target}

要求：
- 解释应简明清晰，符合专业表述。
- 不要生成标题或前缀。
"""

            messages = [
                {"role": "system", "content": "你是一个专业的技术知识解读助手，擅长根据上下文解释术语。"},
                {"role": "user", "content": prompt.strip()}
            ]

            # 调用模型（非流式）
            response_obj = call_llm_api(messages, stream=False)
            if not response_obj:
                result_dict[t] = "模型调用失败或无响应"
                continue

            try:
                text = response_obj.get("choices", [{}])[0].get("message", {}).get("content", "").strip()
            except Exception:
                text = ""

            result_dict[t] = text or "未生成有效内容"

        except Exception as e:
            logger.error(f"处理输入 {t} 时出错: {e}", exc_info=True)
            result_dict[t] = f"生成失败: {str(e)}"

    return result_dict


# 初始化模型配置
def _auto_init_model():
    try:
        config = ConfigParser()
        config.read("config.ini")
        init_models(config)
        logger.info("description 模块已自动初始化 LLM 模型配置。")
    except Exception as e:
        logger.error(f"description 模型初始化失败: {e}", exc_info=True)


_auto_init_model()
